package com.ruoyi.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

public class HexStringToByteDecoder extends ByteToMessageDecoder {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 检查是否还有可读字节
        if (in.readableBytes() >= 2) {
            StringBuilder hexDump = new StringBuilder();

            // 获取ByteBuf中的所有可读字节
            byte[] bytes = new byte[in.readableBytes()];
            in.getBytes(in.readerIndex(), bytes);

            // 将每个字节转换为十六进制格式，并添加到StringBuilder中
            for (byte b : bytes) {
                hexDump.append(String.format("%02X ", b));
            }

            // 输出完整的十六进制数据
            logger.info("Received data: {}", hexDump.toString().trim());

            // 如果需要将解析后的对象传递给下一个handler，
            // 可以根据你的需求将数据封装成特定的对象并添加到out列表中。
            // 例如：
            out.add(hexDump.toString().trim());
        }
    }

    private byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }
}
